/**
 * (1) tuple
 *
 */



/**
 * (2) enum
 *
 * enum { member1, member2 = 3, member3, member4 ... }
 */

/* 匿名枚举 */

/* 具名枚举 */
// 非常量枚举
// a.数字枚举
// 枚举成员可选择性初始化（紧跟在用计算表达式初始化的枚举成员后的首个枚举成员，必须初始化）
// 不初始化时，会进行自动初始化（编译期会依据上一个枚举成员的值加上 1 来确定最终的值，若是首个枚举成员，值为 0）
// 初始化时，可使用常量表达式，也可使用计算表达式（常量表达式在编译期会确定最终的值，计算表达式在运行期确定最终的值）
// 数字枚举最终编译为一个对象，且会以枚举成员的值创建对象的属性，故在使用数字枚举时，可以进行反向映射
enum Role {
  Repoter,
  Developer = 3,
  Maintainer,
  Owner,
  Guest
};
enum Char {
  // const
  a,
  b = Char.a,
  c = 1 + 3,
  // computed
  d = Math.random(),
  e = '123'.length,
  f = 7 // 必须初始化
};
// b.字符串枚举
// 枚举成员必须初始化
// 初始化时，可使用常量表达式，也可使用计算表达式（常量表达式在编译期会确定最终的值，计算表达式在运行期确定最终的值）
// 字符串枚举最终编译为一个对象，但不会以枚举成员的值创建对象的属性，故在使用字符串枚举时，不可以进行反向映射
enum Message {
  Success = '恭喜，成功了',
  Fail = '抱歉，失败了',
};
// c.异构枚举
// 数字成员可选择性初始化
// 字符串成员必须初始化
// 紧跟字符串成员后的首个数字成员必须初始化
enum Answer {
  N,
  Y = 'Yes',
};

// 常量枚举
// 常量枚举在编译期会被移除
const enum Month {
  Jan,
  Feb,
  Mar
};



/**
 * (3) array
 *
 * type[]
 */



/**
 * (4) string
 *
 * string
 */



/**
 * (5) struct
 *
 * interface {
 *   member1: type1;
 *   member2: type2;
 *   member3: type3;
 *   ...
 * }
 */

// 普通匿名结构体

// 组合匿名结构体

// 普通具名结构体
interface Book {
  title: string;
  author: string | undefined;
  readonly price: number;
  [key: string]: any;
  [index: number]: any;
};

const book: Book = {
  title: '',
  price: 12
};

// 组合具名结构体
interface Name {
  first: string;
  last: string;
};
interface Person {
  name: Name;
  id: number;
};
